Paquetes en formato deb
Debian es una de las ramas principales de Linux, pues de ella provienen mas distros derivadas de su forma de funcionar, algo que tambien ocurre con RedHat por ejemplo. En este caso nos vamos a centrar en su sistema de paqueteria, pues los paquetes ".deb" es una de las formas mas sencilla de empaquetar nuestro programa para que luego el usuario pueda instalarlo de forma sencilla.
Necesidad de los paquetes ".deb"
Los paquetes en formato "deb" surgen de diferentes necesidades, las mas importantes ofrecer facilidades al usuario y comodidad al desarrollador al tener una forma de distribuir, actualizar y gestionar su software de una forma mas eficiente y ordenada. Esto ultimo tambien ayuda a que el sistema tenga un mayor control, pues todo estara organizado de una manera concreta. Podriamos decir que esto es una escala, pues Linux se organiza una estructura desde el kernel, luego concensos de como se organizan los directorios, donde va cada cosa y asi sucesivamente hasta llegar a un paquete individual. Aunque a veces no se cumple y la dispersion de Linux provoca que haya sistemas totalmente diferentes en algunos aspectos.
Estructura de los paquetes .deb
La estructura interna de un paquete "deb" consiste en tres partes principales: una sección de control, una sección de datos y una sección de scripts opcionales. Cada una de estas partes cumple una función específica que permite la correcta distribución, instalación y funcionamiento del software empaquetado. A continuación vamos a explicar cada una.
- Sección de Control: Esta sección contiene metadatos del paquete que incluyen información como el nombre del paquete, versión, descripción, arquitectura, dependencias, y otros datos necesarios para la correcta gestión del paquete. Los archivos en esta sección están almacenados en un directorio llamado DEBIAN (en mayúsculas) dentro del paquete "deb". Podriamos resumirlo con que aqui se define que hara el fichero "deb" al ser instalado por el gestor de paquetes, marcando el orden, rutas y configuraciones necesarias.
Un archivo importante en esta sección es el archivo control, que contiene muchos de los metadatos mencionados. Otros archivos importantes pueden incluir preinst, postinst, prerm, y postrm, que son scripts que se ejecutan en varias etapas del proceso de instalación y eliminación.
-
Sección de Datos: Esta sección contiene los archivos y directorios que serán instalados en el sistema destino. La estructura de directorios en esta sección refleja la estructura de directorios del sistema de archivos del sistema destino. Por ejemplo, los archivos que deben ser instalados en /usr/bin en el sistema destino estarán en una estructura de directorios ./usr/bin dentro del paquete .deb.
-
Scripts Opcionales: Los paquetes .deb pueden incluir scripts que se ejecutan antes o después de la instalación o en la desinstalacion del paquete. Estos scripts, que son parte de la sección de control, ayudan a configurar el software, a resolver dependencias o a realizar otras tareas necesarias para la correcta instalación del software. Como habremos podido deducir, el orden en el que se ejecutara viene de la sección de control, en la cual se habra especificado el orden correcto para ejecutar. De forma estandarizada se usa los siguientes nombres para los scripts:
- preinst: se ejecuta antes de que se instalen los archivos del paquete.
- postinst: se ejecuta después de que se instalen los archivos del paquete.
- prerm: se ejecuta antes de que se eliminen los archivos del paquete.
- postrm: se ejecuta después de que se eliminen los archivos del paquete.
Es crucial que estos scripts esten bien escritos y probados, ya que un error en estos scripts puede resultar en el menor de los problemas un fallo en la instalación del paquete y en el peor de los caso que se realice la instalación del paquete de forma completa provocando fallos en el sistema o una inestabilidad general.
Creacion de un paquete "deb"
Extraer paquete deb
Los paquetes .deb son archivos binarios ar que pueden ser extraídos usando herramientas como ar o dpkg. Por ejemplo, para extraer un paquete .deb, puedes ejecutar el comando:
ar x nombre-del-paquete.deb
Esto producirá tres archivos:
- debian-binary: una pequeña archivo que indica la versión del formato del paquete.
- control.tar.gz: un archivo tar comprimido que contiene la sección de control del paquete.
- data.tar.gz o data.tar.xz: un archivo tar comprimido que contiene la sección de datos del paquete.
Cada una de estas partes contribuye a la flexibilidad y robustez del sistema de gestión de paquetes de Debian, permitiendo la distribución, instalación y mantenimiento eficaz del software en sistemas basados en Debian.
Empaquetar paquete deb
Vamos a ver un ejemplo rapido de como se empaquetaria un programa en formato "deb".
- Preparar el Entorno: Antes de comenzar con el proceso de empaquetado, es esencial instalar las herramientas que vamos a necesitar y usar. Estas herramientas serian:
sudo apt-get install dpkg-dev debhelper devscripts
-
Obtener el Código Fuente: Obtén el código fuente del programa que deseas empaquetar. Puede ser un programa que hayas escrito tú mismo o uno de un tercero.
-
Crear estructura de datos: Crea un directorio que contenga la estructura de directorios que se reflejará en el sistema de archivos del sistema destino cuando se instale el paquete. Esto incluye todo lo que vimos anteriormente, como el directorio de control, la estructura que vamos a copiar en el sistema o los scripts que vamos a ejecutar en la instalación.
-
Crear el Archivo de Control: Dentro del directorio
DEBIAN
, crea un archivo llamadocontrol
. Este archivo debe contener metadatos esenciales del paquete, como el nombre, la versión, la arquitectura, las dependencias, y una descripción.
Package: nombre-del-paquete
Version: 2.0-1
Section: base
Priority: optional
Architecture: all
Depends: dependencia1, dependencia2
Maintainer: Tu Nombre <tu@email.com>
Description: Una breve descripción del paquete
- Construir el Paquete .deb:
Desde el directorio padre del directorio del paquete, ejecuta el comando
dpkg-deb
para construir el paquete .deb.
dpkg-deb --build nombre-del-paquete
Este proceso producirá un archivo nombre-del-paquete_1.0-1_all.deb
(o un nombre similar) que es tu paquete .deb listo para ser distribuido e instalado en sistemas Debian o basados en Debian.
Puedes utilizar herramientas más avanzadas y flexibles como debhelper
y dh_make
para crear paquetes .deb, especialmente para proyectos más complejos. Estas herramientas pueden simplificar muchos de los pasos y proporcionar plantillas y ayuda para crear paquetes .deb de manera más eficiente.
Antes de distribuir tu paquete, es muy importante que lo pruebes en un entorno seguro para asegurarte de que se instala, funciona y se elimina correctamente. Pues un paquete con "bugs" puede causar graves problemas al usuario final.
Gestores para los paquetes deb
Junto al formado "deb" tambien se creo herramientas capaz de trabajar con el, pues de nada serviria crear un formato nuevo que viene a facilitar el proceso de instalación, si luego tenemos que extraerlo de forma manual como si fuese un "tar".
Para esta tarea se desarrollo inicialmente la herramienta "dpkg" y luego otra de mas nivel como "apt-get (actualmente "apt")" entre otras.
DPKG (Debian Package Management System)
Esta herramienta es la encargada de coger un paquete deb
y realizar su instalación. Para hacer esto sigue un orden de tareas a realizar que comentaremos a continuación.
-
Comprobación de las dependencias:
dpkg
revisa las dependencias del paquete para asegurar que todas las librerías y paquetes necesarios estén presentes. Si faltan dependencias,dpkg
informará al usuario pero no las resolverá automáticamente.
-
Extracción del Paquete:
dpkg
extrae el contenido del archivodeb
en una área temporal. Un paquetedeb
generalmente consta de las tres secciones que hemos explicado anteriormente.
El proceso de instalación puede variar ligeramente dependiendo de las opciones específicas con las que se ejecuta dpkg
, y de los scripts específicos incluidos en el paquete que se está instalando.
-
Ejecución de Scripts Pre-Instalación:
- Si existen, se ejecutan los scripts de pre-instalación incluidos en el paquete. Estos scripts pueden detener servicios, eliminar archivos antiguos, o realizar cualquier otra preparación necesaria para la instalación.
-
Instalación de Archivos:
- Los archivos del programa se copian en las ubicaciones necesarias del sistema de archivos. Esto incluye binarios, librerías, documentación, etc.
-
Configuración:
- Se ejecutan los scripts de post-instalación incluidos en el paquete. Esto puede incluir la configuración inicial del software, el arranque de servicios...etc
- En este paso también se configuran los archivos de configuración. Si un archivo de configuración ya existe y el paquete contiene una versión nueva,
dpkg
puede preguntar al usuario cómo proceder haciendo uso del programadebconf
.
Debconf es un sistema de configuración de software para los sistemas operativos Debian y derivados. Es usado durante la instalación de nuevos paquetes o la reconfiguración de paquetes existentes. Debconf permite a los paquetes preguntar al usuario ciertas preguntas en el momento de la instalación, para personalizar la configuración según las necesidades del usuario o del sistema.
- Registro:
dpkg
registra la información del paquete en el sistema, incluyendo la versión instalada y los archivos que ha colocado o modificado. Esto es esencial para la gestión futura del paquete y para asegurar la integridad del sistema.
Perder la base de datos que registra dpkg
de los paquetes o que sea modificada sin control puede causar un gran problema. Esto se debe a que si no sabe que paquetes tiene isntalado en el sistema o sus versiones no sabra cuales actualizar o intentara instalar paquetes ya existente provocando errores.
- Limpieza:
- Finalmente,
dpkg
limpia los archivos temporales.
- Finalmente,
Este proceso asegura que el software se instale correctamente, con todas las configuraciones necesarias, y que el sistema esté al tanto de los nuevos archivos y software instalados. También destaca la diferencia entre dpkg
y herramientas de nivel superior como apt
, que proporciona una gestión de dependencias más amigable y una interfaz de usuario más rica.
APT (Advanced Package Tool)
Los años posteriores a la creación de dpkg
se creo una herramienta mas completa, de lo que se conoce como alto nivel. Esta herramienta no solo seria capaz de hacer uso de dpkg
, debconf
si no que tambien haria uso de otras herramientas para obtener los paquetes desde un servidor externo, al que se le conoceria como repositorio. Tambien seria capaz de instalar todas las dependencias y dependencias de estas para que funcione el programa que vamos a instalar.
Repositorio
Una de las parte mas importante respecto a dpkg
es que ahora existen unos repositorios como hemos mencionado. Estos son usados por apt
para obtener los paquetes, podriamos decir que se conecta a un servidor y se descarga el paquete que vas a instalar. Como añadido tambien mira las dependencias de ese paquete que estan escrita en su fichero de control para buscarlo y descargarlos tambien.
Para asegurarnos de que lo que estamos descargando es algo fiable y no un virus como puede pasarno por internet, se siguen unas medidas de seguridad. A continuación vamos a verlas brevemente:
- Firmas Digitales:
- Los repositorios utilizan firmas digitales para garantizar que los paquetes no han sido alterados desde su creación. Los paquetes del repositorio son firmados por los creadores o mantenedores del repositorio utilizando una clave privada. Los usuarios pueden verificar estas firmas utilizando la clave pública correspondiente.
La clave pública del repositorio se debe importar al sistema del usuario para que pueda verificarse la firma del paquete. Esta clave se suele proporcionar por el propio repositorio y se importa al sistema una sola vez, por ejemplo, al añadir un nuevo repositorio. Normalmente se si se usa herramientas de alto nivel como apt
se importan solas.
-
Sumas de Comprobación (Checksums):
- Las sumas de comprobación (como SHA256 o MD5) se utilizan para verificar la integridad de los datos de los paquetes. Al descargar un paquete, el gestor de paquetes calcula la suma de comprobación del paquete descargado y la compara con la suma de comprobación proporcionada en los metadatos del repositorio.
-
HTTPS:
- Muchos repositorios utilizan HTTPS para el transporte seguro de paquetes entre el repositorio y el sistema del usuario. Esto ayuda a garantizar la confidencialidad e integridad de los datos durante la transmisión.
-
Control de Acceso y Auditoría:
- Los mantenedores del repositorio controlan quién tiene acceso para subir nuevos paquetes o actualizar los existentes. Además, a menudo se realizan auditorías para detectar cualquier actividad sospechosa o malintencionada.
-
Políticas de Mantenimiento:
- Los repositorios bien mantenidos tienen políticas estrictas sobre cómo se deben construir y mantener los paquetes, incluyendo la revisión del código y las actualizaciones de seguridad ante las vulnerabilidades que se descubran.
- La comunidad de usuarios y desarrolladores también desempeña un papel en la revisión y reporte de problemas de seguridad o bugs en los paquetes.
A pesar de todos estos mecanismos, siempre existe el riesgo de que un paquete malintencionado o comprometido pueda infiltrarse en un repositorio, especialmente en repositorios menos mantenidos o no oficiales. Por lo tanto, se recomienda a los usuarios que utilicen repositorios confiables y mantengan sus sistemas actualizados.
Proceso de instalación de un paquete con apt
A continuación vamos a ver los pasos que sigue esta herramienta para instalar un paquete, aunque podremos comprobar que son muy similares a dpkg
, pues realmente esta herramienta hace uso de la anterior y de otras para hacer una gestion mas completa.
-
Resolución de Dependencias:
apt
comienza revisando las dependencias del paquete que se desea instalar. Identifica todas las dependencias y subdependencias necesarias, asegurando que todas se instalen antes de proceder.
-
Descarga de Paquetes:
- Una vez resueltas las dependencias,
apt
descarga el paquete principal junto con todos los paquetes que sean parte de este de los repositorios configurados en el sistema.
- Una vez resueltas las dependencias,
-
Verificación de la Integridad:
- Antes de la instalación,
apt
verifica la integridad de los paquetes descargados comparando las sumas de comprobación con las listadas en los repositorios.
- Antes de la instalación,
-
Desempaquetado e Instalación:
apt
pasa el control adpkg
para desempaquetar e instalar cada paquete. Esto incluye la ejecución de scripts pre-instalación, la copia de archivos en las ubicaciones correctas, y la ejecución de scripts post-instalación.
-
Configuración:
- Durante la instalación, se realizan las configuraciones necesarias. Si un archivo de configuración ya existe y el paquete contiene una versión nueva,
apt
(a través dedpkg
) puede preguntar al usuario cómo proceder.
- Durante la instalación, se realizan las configuraciones necesarias. Si un archivo de configuración ya existe y el paquete contiene una versión nueva,
-
Actualizacion de la base de datos:
apt
registra la información del paquete en el sistema, incluyendo la versión instalada y los archivos que ha colocado o modificado. Esto es esencial para la gestión futura del paquete y para asegurar la integridad del sistema.
-
Limpieza:
- Tras una instalación exitosa,
apt
puede limpiar los archivos temporales y paquetes descargados, especialmente si se utiliza la opciónautoclean
oautoremove
.
- Tras una instalación exitosa,
El uso de apt
simplifica mucho la gestión de paquetes en comparación con dpkg
solo, gracias a su capacidad para resolver y gestionar dependencias automáticamente, así como su interfaz de usuario más amigable.
Conclusion
Como hemos podido comprobar en este artículo, una de las grandes ventajas que tiene Linux es la capacidad de las personas de añadir soluciones a problemas que existen. Esto puede jugar también en contra debido a la demasiada dispersión de ideas, pero puede llegar a ser una ventaja cuando realmente se crea algo que suple una necesidad. Los paquetes en formato "deb
" junto a las herramientas que lo gestionan han hecho que Debian sea una de las distribuciones más usadas y de las que más derivadas se han creado.
Todo esto se debe a la facilidad de su paquetería, aunque no está exenta de problemas, sobre todo en la gestión de tantas dependencias; es algo que con los años se ha ido solucionando, o mejorado en la distro que se ha basado en ella. En este artículo vamos a hacer un ejercicio práctico con el uso de la terminal para gestionar paquetes.